package network;

public class TcpPractice {
    /*在网络中每一个数据报都是单独发送的，所以就有可能出现后发先至的情况
    * 但是tcp自身承担了这个整队的任务，tcp会有一个缓冲区（一块内核中内存空间）
    * 每个socket都有自己的一份缓冲区，tcp就可以按照序号针对收到的消息进行整队
    * 这也是tcp的一个重要的作用（整队用到的数据结构：优先级队列）
    * 丢包，也是网络上的典型情况（比如游戏的卡顿）
    * 为啥会丢包：网络上的传输可能进行一些列的路由器和交换机的转发，任何一个节点除了问题
    * 都可能导致丢包，每个设备都是在承担很多转发任务的，每个设备准发能力都是有上限的
    * 某一时刻，某个设备，上面的流量达到峰值后，就可能引起部分数据丢失的情况
    * 如果包丢了，接收方就收不到哦了，自然就不会返回ack报文（应答报文），等待一段时间之后，
    * 如果还是没有收到ack报文，发送方就视为刚才传输的数据丢包了，就会重新再发一遍
    * （被称为超时重传）网络丢包是概率性事件，上个包丢了，重传还是有很大概率传过去的
    * 这就是说tcp的可靠传输是尽可能的保证数据能够传过去*/

    /*tcp两个最核心的机制：1.一切顺利，使用确认应答保证可靠性
    *                   2.出现丢包，使用超时重传作为补充
    * 这是tcp保证可靠性的基石！*/
    /*连接管理
    * 1.建立连接：三次握手：确认了客户端和服务器各自的发送能力和接收能力都是正常的
    *                    这就是后续可靠传输的基础！（三次握手相当于是投石问路的过程）
    * ack：确认应答报文   syn：同步报文段（意思就是一方要和另一方申请建立连接）本质上他俩都是tcp的一个数据报
    * 然后服务器发送回来ack和syn数据报时可以分开发但是没必要，分两次发就得需要封装和解析两次，降低了效率
    * 但是不是可靠性就是因为三次握手，可靠性的核心机制是因为1.确认应答，2.超时重传
    * 虽然和可靠性有关系，但是关系不大
    *
    * 2.断开连接：四次挥手：FIN：结束报文     ack：应答报文
    * 结合滑动窗口的快速重传--> 批量发送数据的时候*/
}
